iOS功能_通用链接

[toc]

Universal Links(通用链接)

相关文档:

Universal Links(通用链接),是iOS9推出的一项新功能。如果你的应用(app)支持通用链接(Universal Link)之后,iOS用户能够在点击网页的链接的时候无缝的重定向到已经安装的app,不需要额外的任何操作。如果没有安装对应的app,那么点击链接会使用Safari打开网页。

附:在iOS9以前,对于各种浏览器,Safari中唤醒app的需求,我们通常是只能使用scheme的方式。现在iOS9之后,我们多了一种方式。两种方式的区别是scheme能够支持我们跳转app的时候加入参数。

二、Universal Links的表现及测试

假设对于 com.dvlproad.Beyond 这个app,

dvlproad.com/app 是通用链接, dvlproad.com/mobile 不是通用链接。

1、在浏览器Safari地址栏中的表现

则我们先分别将这些链接粘贴到浏览器Safari的地址栏中,

1、浏览器地址栏为非通用链接时,没什么特别。
2、而浏览器地址栏为通用链接的时候,
①如果我们有安装`com.dvlproad.Beyond这个app,则会发现该页面下滑后,在顶部会多了个在应用中打开的操作,形如:

UniversalLinks_show1

②如果我们没有安装com.dvlproad.Beyond这个app,则没有多这栏打开。即使你的通用链接都配置正确了。

2、在非浏览器,如备用录app里的表现

UniversalLinks_show2

我们会发现点击

1、备忘录中的链接为非通用链接时,点击链接没什么特别。
2、而备忘录中的链接为通用链接的时候,点击链接会直接跳转到我们的com.dvlproad.Beyond这个app上。

三、Universal Links的实现

要让一个链接成为通用链接。需要

1、开启配置 Associated Domains

只有以该域名开头的链接,才可能是通用链接。

2、制作上传 apple-app-site-association

1、Associated Domains

1、进入苹果Apple Developer -> Member Center -> Certificates, Identifiers & Profiles – >Identifiers - >App IDs–>Edit 然后开启打钩 Associated Domains 后保存。

img

如果你使用Xcode的自动管理证书,可直接跳到第二步,即Xcode会在你打开Associated Domains时,自动帮你处理证书配置问题以及appIDs打开Associated Domains。

2、在项目中添加Associated Domains

AssociatedDomains_Set1/AssociatedDomains_Set1.png)

点击Associated Domains的+号填入applinks:后面是你的域名。

AssociatedDomains_Set2/AssociatedDomains_Set2.png)

及添加完后,只有以该域名dvlproad.com开头的链接,才可能是通用链接。

附:有时候,上面的设置也会改使用二级域名,如applinks:app.dvlproad.com。

2、apple-app-site-association

App在安装的时候,iOS系统会去根据该app配置里填的那些Associated Domains下,去这些域的根目录下,取apple-app-site-association文件。

我们创建apple-app-site-association文件,并上传也是为了让iOS系统通过Associated Domainsapple-app-site-association这个文件,一起知道你的哪些是链接是Universal Links,哪些不是Universal Links。

2.1、制作apple-app-site-association 文件

创建一个命名为apple-app-site-association文件,文件名必须为apple-app-site-association!!!(注意这个文件必须没有后缀名

apple-app-site-association内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"applinks": {
"apps": [],
"details": [
{
"appID": "myTeamId.com.dvlproad.Beyond1",
"paths": [ "*" ]
},
{
"appID": "myTeamId.com.dvlproad.Beyond2",
"paths": [ "app" ]
}
]
}
}

appID 是由你的Team ID+BundleID组成,如果你不知道你的Team ID是什么?进入苹果Apple Developer -> Member Center ->Membership->Team ID

paths 是一个字符串的数组,这里是你的应用支持的通用链接与不支持的链接,例如你使用的是/*,代表着只要是Associated Domains域名下的所有的链接都支持。如果你不支持某一个链接,在这个链接前面加NOT空格,举个例子

“paths”:[ “NOT /home/“, “/“ ]

如果这样写就是除了不支持/home下所有的链接,其他链接都支持。

2.2、上传apple-app-site-association 文件

把你刚才制作好的apple-app-site-association文件,放到1中Associated Domains所填写的域名dvlproad.com的根目录下或者.well-known下(要怕除问题,两个地方都放也行。)。

2.3、检测上传的apple-app-site-association 文件是否成功

①、通过浏览器访问https://xxx.com/apple-app-site-association地址,看文件是否上传成功。

②、苹果有一个检测的接口 苹果测试入口 ,将你的域名放入测试口,点击TestURL即可。

2.4、上传apple-app-site-association 文件到dvlproad.github.io的例子

为方便测试,我们域名使用dvlproad.github.io这个。

1、apple-app-site-association必须放置在域名的根目录或者 .well-known 目录下,

2、在本地测试跟路径是否有效。

方法:将apple-app-site-association放置好后,我们执行hexo s,则我们就能成功访问http://localhost:4000,进而http://localhost:4000/apple-app-site-association

UniversalLinks_test1/UniversalLinks_test1.png)

3、本地可以后,就部署到服务器

测试部署成功与否,通过浏览器访问https://dvlproad.github.io/apple-app-site-association

1、优先本地部署测试,即 hexo s 后,通过浏览器访问:
http://localhost:4000/apple-app-site-association 如果可以下载则文件位置放置在根目录正确。
2、本地测试通过后,进行远程部署 hexo g 和 hexo d 测试,及通过浏览器访问:
https://dvlproad.github.io/apple-app-site-association
如果可以下载代表在1的基础上,远程部署也成功了。
如果无法访问/下载,而又确认部署完成了,那一般是部署了但还没同步到域名地址上的问题。建议等等或者再部署一下看看。

3、写一个通用链接并测试

为进一步了解知道哪些链接是通用链接,哪些不是。我们以上述例子进行说明。

则对于com.dvlproad.Beyond1这个app,由于paths是[ "*" ]

即只要是dvlproad.com开头的链接都是通用链接。

而对于com.dvlproad.Beyond2这个app,由于paths是[ "app" ]

所以,只有以dvlproad.com/app开头的链接才是通用链接。即形如 dvlproad.com/app/111、dvlproad.com/app/abc 等都是通用链接。

通用链接的测试方法,请按上面已经写玩的Universal Links的表现及测试进行测试,不再累述。

四、Universal Links的使用

在AppDelegate添加下面的方法处理Universal Links

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//TODO:后台进入前台/通用链接
#pragma mark - Universal Link
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler {

NSLog(@"userActivity : %@",userActivity.webpageURL.description);
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *webUrl = userActivity.webpageURL;
NSArray *universalLinks = LUCKIN_UNIVERSALLINKS;
BOOL isUniversalLinks = NO;
for (NSString *universalLink in universalLinks) {
isUniversalLinks = [webUrl.host isEqualToString:universalLink];
if (isUniversalLinks) {
break;
}
}
if (isUniversalLinks) {
//TODO:判断域名是自己的网站,进行我们需要的处理
} else {
[[UIApplication sharedApplication] openURL:webUrl];
}
}
return YES;
}

当用Universal Links启动APP时就会调用上面的方法。

把我们设置好通用链接的URL放到备忘录中,长按URL会多出一条在“××××”中打开,当你点击时就会打开你的APP,并且在上面的方法中将URL传给你处理。

微信SDK的最新版本openSDK1.8.6 开始,需要进行Universal Links配置。

1、分析微信配Universal Links的原因

回顾iOS9之前,假设一个页面在微信app内部打开,其要跳转到app,一般需要先跳转到浏览器,如Safari中,然后才能再进行scheme跳转到我们的应用。

UniversalLinks_wechat1

而有了Universal Links后,现在你用微信打开的页面,跳转的时候,即可直接跳转到app中,不用再经过浏览器。

2、微信配Universal Links的操作

2.1、基本分享操作的支持

微信分享配置Universal Links的有两个地方。

1、微信开放平台 https://open.weixin.qq.com 上对应app的Universal Links配置

UniversalLinks_wechat_Set1/UniversalLinks_wechat_Set1.png)

2、微信SDK使用时候的Universal Links配置。

如果上述两个值设置不一样,会导致在app中点击分享的时候,没法正常调起分享操作。错误信息如下:

UniversalLinks_wechat_error1

我们知道Universal Links是用来做通用链接的。但要完成这一步的操作不需要我们去开Associated Domains和上传apple-app-site-association才能完成基本的分享操作了。

2.2、分享完微信能够正常返回

iOS 9系统策略更新,限制了http协议的访问,需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。

1
2
3
4
5
6
7
8
9
10
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
<string>weixinULAPI</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

2.3、可以在微信内部直接跳转到app

实现Universal Links的实现。即

1、开启配置 Associated Domains

2、制作上传 apple-app-site-association

上面已说明,请查看上面内容。

End